package com.itheima.filter;

import com.alibaba.fastjson.JSON;
import com.itheima.common.BaseContext;
import com.itheima.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.AntPathMatcher;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Slf4j
@WebFilter("/*")
public class LoginCheckFilter implements Filter {
    @Override
    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {

        log.info("LoginCheckFilter 线程id="+Thread.currentThread().getId());

        //0、强转两个对象
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;

        //1、获取本次请求的URI
        String uri = req.getRequestURI();
        log.info("uri:{}",uri);

        //2、声明不需要登录的请求资源地址    【登录检查过滤实际上就是判断页面打开是否有发送动态资源请求，如果有并且没有进行登录，则需要跳转到登录页面】
        String[] urls = {
                            "/backend/**",
                            "/front/**",
                            "/employee/login",
                            "/employee/logout",
                            "/user/sendMsg",
                            "/user/login"
                        };

        //3、判断本次请求是否需要登录  //eg:/backend/index.html
        AntPathMatcher pathMatcher = new AntPathMatcher();    //工具类：路径匹配器  支持占位符模式匹配
        for (String url : urls) {
            //match(url,uri)：验证当前请求地址是否匹配不需要登录的资源地址 如果匹配，返回true
            // 第一个参数：不需求登录的请求资源地址表达式 第二个参数：本次请求地址
            if(pathMatcher.match(url,uri)){
                //4、如果不需要登录，则直接放行
                chain.doFilter(req,resp);
                return;     //直接跳出方法 结束执行 代码不再往下走
            }
        }

        //5、如果需要登录，判断登录状态，如果已登录，则直接放行 【从session中获取员工id数据】
        Object employee = req.getSession().getAttribute("employee");
        if(employee!=null){
            //在放行之前讲登录系统的用户id存入ThreadLocal中
            BaseContext.setCurrentId((Long) employee);

            //已登录，则直接放行
            chain.doFilter(req,resp);
            return;     //直接跳出方法 结束执行 代码不再往下走
        }

        //5.2:如果需要登录，判断登录状态，如果已登录，则直接放行 【从session中获取用户id数据】
        Object user = req.getSession().getAttribute("user");
        if(user!=null){
            //在放行之前讲登录系统的用户id存入ThreadLocal中
            BaseContext.setCurrentId((Long) user);
            //已登录，则直接放行
            chain.doFilter(req,resp);
            return;
        }


        //6、如果未登录则返回未登录结果  前端要求：未登录 code=0  msg="NOTLOGIN"
        resp.getWriter().print(JSON.toJSONString(R.error("NOTLOGIN")));
    }

    @Override
    public void init(FilterConfig config) throws ServletException {

    }

}